/**
 * @description good 服务层
 * @author LI
 */

const { GoodsInfo, Product, DecoratItem, GoodsPhoto } = require('../db/model/index')
const Op = require('sequelize').Op
const { formatMoreTime } = require('../utils/dateTime')

/**
 * 创建商品信息
 * @param {string} goodSn 商品货号
 * @param {string} goodName 商品名称
 * @param {number} goodType 商品类型
 * @param {number} goodSort 商品排序
 * @param {string} goodImg 商品图片
 * @param {string} goodVideo 商品视频
 * @param {string} remark 商品视频描述
 */
async function createGoods({ goodSn, goodName, goodType, goodSort, goodImg, goodVideo, remark }) {
  const result = await GoodsInfo.create({
    goodSn,
    goodName,
    goodType,
    goodSort,
    goodImg,
    goodVideo,
    remark
  })

  return result
}

/**
 * 获取全部商品信息
 * @param {string} goodType 商品类型
 * @param {string} goodName 商品名称
 * @param {number} page 第几页
 * @param {number} limit 多少条
 */
async function getGoodsList({ goodType = '', goodName = '', page = 1, limit = 10 }) {
  const result = await GoodsInfo.findAndCountAll({
    limit: limit, // 每页多少条
    offset: limit * (page - 1), // 跳过多少条
    where: {
      goodType: {
        [Op.like]: '%' + goodType + '%'
      },
      goodName: {
        [Op.like]: '%' + goodName + '%'
      }
    }
  })
  result.rows.map(item => {
    // 格式化时间 多个
    item.dataValues = formatMoreTime(item.dataValues)
  })

  return result
}

/**
 * 通过 id 更新商品
 * @param {number} id id 必传
 * @param {string} goodSn 商品货号
 * @param {string} goodName 商品名称
 * @param {string} goodType 商品类型
 * @param {number} goodSort 商品排序
 * @param {string} goodImg 商品图片
 * @param {string} goodVideo 商品视频
 * @param {string} remark 商品视频描述
 */
async function updateGoodById({ id, goodSn, goodName, goodType, goodSort, goodImg, goodVideo, remark }) {
  // 拼接修改内容
  const updateData = {}
  if (goodSn) {
    updateData.goodSn = goodSn
  }
  if (goodName) {
    updateData.goodName = goodName
  }
  if (goodType) {
    updateData.goodType = goodType
  }
  if (goodImg) {
    updateData.goodImg = goodImg
  }
  if (goodVideo) {
    updateData.goodVideo = goodVideo
  }
  if (goodSort) {
    updateData.goodSort = goodSort
  }
  if (remark) {
    updateData.remark = remark
  }
  const result = await GoodsInfo.update(updateData, {
    where: {
      id
    }
  })

  return result[0] > 0
}

/**
 * 通过 id 删除商品信息
 * @param {number} id id
 */
async function deleteGoodById(id) {
  const GoodsInfos = await GoodsInfo.findAll({
    where: { id },
    include: [
      { model: Product },
      { model: GoodsPhoto },
      { model: DecoratItem },
    ],
  })

  for (const goodsInfo of GoodsInfos) {
    for (const child of goodsInfo.products) {
      child.destroy();
    }
    for (const child1 of goodsInfo.goodsPhotos) {
      child1.destroy();
    }
    for (const child2 of goodsInfo.decoratItems) {
      child2.destroy();
    }
    goodsInfo.destroy();
  }

  return true
}

module.exports = {
  createGoods,
  getGoodsList,
  updateGoodById,
  deleteGoodById
}
